Skip to content

Conversation

@jiridanek
Copy link
Member

@jiridanek jiridanek commented Sep 23, 2025

Description

How Has This Been Tested?

Self checklist (all need to be checked):

  • Ensure that you have run make test (gmake on macOS) before asking for review
  • Changes to everything except Dockerfile.konflux files should be done in odh/notebooks and automatically synced to rhds/notebooks. For Konflux-specific changes, modify Dockerfile.konflux files directly in rhds/notebooks as these require special attention in the downstream repository and flow to the upcoming RHOAI release.

Merge criteria:

  • The commits are squashed in a cohesive manner and have meaningful messages.
  • Testing instructions have been added in the PR body (for PRs involving changes that are not immediately obvious).
  • The developer has manually tested the changes and verified that the changes work

Summary by CodeRabbit

  • New Features

    • Added cross-compilation support enabling builds for additional target architectures
    • Integrated Zig toolchain for enhanced compilation capabilities
    • Expanded image build matrix for Python 3.12 releases, including additional variants
  • Chores

    • Enhanced build system with improved toolchain provisioning and architecture handling

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 23, 2025

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 23, 2025

Walkthrough

This PR introduces Zig cross-compilation toolchain support to the build system. It adds architecture normalization and Zig installation targets to the Makefile, creates a new zigcc compiler wrapper in Go, updates the sandbox script to configure cross-compilation targeting s390x-linux-gnu.2.34, adjusts Docker runtime configurations, and expands the Python 3.12 image build matrix.

Changes

Cohort / File(s) Summary
Zig Toolchain Installation
Makefile
Introduces architecture normalization (amd64 → x86_64, arm64 → aarch64), defines ZIG_VERSION and ZIG_BINARY variables, adds bin/zig-$(ZIG_VERSION) target to download and extract Zig for system architecture with s390x-linux-gnu.2.34 shim wrappers, adds phony install-zig and clean-zig targets, expands all-images build matrix for Python 3.12 releases
Zig Compiler Wrapper
scripts/zigcc/Makefile, scripts/zigcc/go.mod, scripts/zigcc/zigcc.go, scripts/zigcc/zigcc_test.go
Introduces new Go-based compiler wrapper module for zigcc with Makefile targets (build, test, fmt, vet, clean), establishes go.mod for zigcc module at Go 1.24, implements wrapper that maps executable name to Zig subcommand, transforms and expands -Wp,... arguments, and executes Zig with fixed s390x-linux-gnu.2.34 target, includes table-driven tests for -Wp argument processing
Cross-Compilation Setup
scripts/sandbox.py, wrapper.py
Extends sandbox.py with target-specific s390x-linux-gnu.2.34 configuration, replaces simple command construction with substitution mechanism for "{};" placeholder injection of Docker volumes/environment flags, ensures bin/zig-0.15.1 and zigcc build prerequisites exist before sandbox setup, adds diagnostic log blocks; introduces new wrapper.py script that normalizes -Wp,-D... flags, detects zig-cc/zig-c++ invocations, and executes through /mnt/zig with appropriate target triple
Docker Runtime Configuration
runtimes/minimal/ubi9-python-3.12/Dockerfile.cpu
Adds no-op RUN command for /mnt listing, adjusts architecture-specific OS package set for s390x and ppc64le to replace gcc g++ make with gcc g++ ninja-build

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

  • scripts/sandbox.py: Review the substitution mechanism for "{};" placeholder injection, build prerequisite logic for Zig toolchain, and environment variable handling for cross-compilation
  • scripts/zigcc/zigcc.go: Verify argument transformation logic (-Wp flag expansion), Zig invocation correctness, and target triple handling
  • Makefile: Validate architecture normalization, Zig version/binary definitions, and build target dependencies
  • Integration points: Ensure sandbox.py correctly builds and stages zigcc artifacts, and that wrapper.py complements the Go wrapper's functionality

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is an empty template with all sections unfilled and all checklist items unchecked. No implementation details, testing information, or rationale for the changes are provided. Complete the Description section with detailed explanation of changes, fill in the How Has This Been Tested section with testing details, and check all applicable checklist items before merge.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title is vague and doesn't clearly convey the primary changes; it references mounting /mnt but lacks specificity about what is actually being implemented. Revise the title to be more descriptive of the main changes, such as 'Add Zig toolchain cross-compilation support for s390x builds' or similar, to better reflect the substantial additions across multiple files.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch jd_zig

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Sep 23, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by:
Once this PR has been reviewed and has the lgtm label, please assign jesuino for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@github-actions github-actions bot added the review-requested GitHub Bot creates notification on #pr-review-ai-ide-team slack channel label Sep 23, 2025
@openshift-ci openshift-ci bot added the size/s label Sep 23, 2025
@openshift-ci openshift-ci bot added size/m and removed size/s labels Sep 23, 2025
@openshift-ci openshift-ci bot added size/m and removed size/m labels Sep 23, 2025
… cross-compilation and unset them afterward.
@openshift-ci openshift-ci bot added size/m and removed size/m labels Sep 23, 2025
@openshift-ci openshift-ci bot added size/m and removed size/m labels Sep 23, 2025
@openshift-ci openshift-ci bot added size/l and removed size/m labels Sep 23, 2025
@openshift-ci openshift-ci bot removed the size/l label Sep 24, 2025
@openshift-ci openshift-ci bot added the size/l label Sep 24, 2025
@openshift-merge-robot
Copy link
Contributor

PR needs rebase.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci openshift-ci bot added size/l and removed size/l labels Nov 12, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 56c9cde and c6c9441.

📒 Files selected for processing (8)
  • Makefile (1 hunks)
  • runtimes/minimal/ubi9-python-3.12/Dockerfile.cpu (2 hunks)
  • scripts/sandbox.py (2 hunks)
  • scripts/zigcc/Makefile (1 hunks)
  • scripts/zigcc/go.mod (1 hunks)
  • scripts/zigcc/zigcc.go (1 hunks)
  • scripts/zigcc/zigcc_test.go (1 hunks)
  • wrapper.py (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
wrapper.py (1)
scripts/sandbox.py (1)
  • main (27-80)
🪛 checkmake (0.2.2)
scripts/zigcc/Makefile

[warning] 1-1: Missing required phony target "all"

(minphony)

🪛 Ruff (0.14.4)
scripts/sandbox.py

51-51: Local variable target is assigned to but never used

Remove assignment to unused variable target

(F841)


62-62: f-string without any placeholders

Remove extraneous f prefix

(F541)


64-64: f-string without any placeholders

Remove extraneous f prefix

(F541)


65-65: f-string without any placeholders

Remove extraneous f prefix

(F541)


84-84: String contains ambiguous × (MULTIPLICATION SIGN). Did you mean x (LATIN SMALL LETTER X)?

(RUF001)


146-146: subprocess call: check for execution of untrusted input

(S603)


148-148: subprocess call: check for execution of untrusted input

(S603)


150-150: subprocess call: check for execution of untrusted input

(S603)

wrapper.py

1-1: Shebang is present but file is not executable

(EXE001)


16-16: Consider iterable unpacking instead of concatenation

Replace with iterable unpacking

(RUF005)


18-18: Consider iterable unpacking instead of concatenation

Replace with iterable unpacking

(RUF005)


20-20: Avoid specifying long messages outside the exception class

(TRY003)


22-22: Starting a process without a shell

(S606)

Comment on lines 35 to 37
if [ "$ARCH" = "s390x" ] || [ "$ARCH" = "ppc64le" ]; then \
PACKAGES="$PACKAGES gcc g++ make openssl-devel autoconf automake libtool cmake"; \
PACKAGES="$PACKAGES gcc g++ ninja-build openssl-devel autoconf automake libtool cmake"; \
fi && \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Restore make for non-ninja builds on s390x/ppc64le

Dropping make here leaves those arches without the classic build tool that many Python/C extensions still expect, so pip install of projects that call make will now fail. Please keep make while adding ninja-build.

-        PACKAGES="$PACKAGES gcc g++ ninja-build openssl-devel autoconf automake libtool cmake"; \
+        PACKAGES="$PACKAGES gcc g++ make ninja-build openssl-devel autoconf automake libtool cmake"; \
🤖 Prompt for AI Agents
In runtimes/minimal/ubi9-python-3.12/Dockerfile.cpu around lines 35 to 37, the
s390x/ppc64le PACKAGES list removed make which breaks builds that invoke make;
update the PACKAGES assignment to include make alongside ninja-build (e.g., add
"make" to the quoted package list) so both classic make and ninja are available
for those architectures.

Comment on lines +1 to +3
module zigcc

go 1.24
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Target a released Go toolchain

go 1.24 is not available yet, so current builders (Go ≤1.22/1.23) will abort with “requires go >=1.24”. Drop to the latest released version you actually need (e.g. 1.22).

-go 1.24
+go 1.22
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
module zigcc
go 1.24
module zigcc
go 1.22
🤖 Prompt for AI Agents
In scripts/zigcc/go.mod around lines 1 to 3, the module specifies "go 1.24"
which is not yet released and will abort builds on current Go toolchains; change
the go directive to an actual released version your project needs (for example
"go 1.22" or the minimum released version that supports the features you use),
update any CI/docker builders to match that version if necessary, and run go mod
tidy/build locally to verify compatibility.

Comment on lines +9 to +18
for arg in sys.argv[1:]:
if arg.startswith("-Wp,-D"):
args.append(arg.replace("-Wp,-D", "-D", 1))
else:
args.append(arg)

if arg0 == "zig-cc":
args = ["/mnt/zig", "cc", "-target", "s390x-linux-gnu.2.34"] + args
elif arg0 == "zig-c++":
args = ["/mnt/zig", "c++", "-target", "s390x-linux-gnu.2.34"] + args
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix -Wp flag rewriting

Replacing -Wp,-DNDEBUG,-D_FORTIFY_SOURCE=2 with a single -DNDEBUG,-D_FORTIFY_SOURCE=2 string prevents the compiler from seeing either define. Split the flag like the Go shim does.

-    for arg in sys.argv[1:]:
-        if arg.startswith("-Wp,-D"):
-            args.append(arg.replace("-Wp,-D", "-D", 1))
-        else:
-            args.append(arg)
+    for arg in sys.argv[1:]:
+        if arg.startswith("-Wp,"):
+            args.extend(part for part in arg.split(",")[1:] if part)
+        else:
+            args.append(arg)
🧰 Tools
🪛 Ruff (0.14.4)

16-16: Consider iterable unpacking instead of concatenation

Replace with iterable unpacking

(RUF005)


18-18: Consider iterable unpacking instead of concatenation

Replace with iterable unpacking

(RUF005)

@jiridanek
Copy link
Member Author

@coderabbitai provide commentary and improvement suggestions for the zig cc approach

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 12, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Read the Zig wrapper implementations and related files
echo "=== zigcc.go ==="
cat scripts/zigcc/zigcc.go

echo -e "\n=== wrapper.py ==="
cat wrapper.py

echo -e "\n=== sandbox.py (relevant sections) ==="
cat scripts/sandbox.py

echo -e "\n=== Makefile (Zig installation section) ==="
grep -A 30 "ZIG_VERSION" Makefile | head -50

echo -e "\n=== zigcc tests ==="
cat scripts/zigcc/zigcc_test.go

echo -e "\n=== Dockerfile changes ==="
cat runtimes/minimal/ubi9-python-3.12/Dockerfile.cpu

Length of output: 16240


@jiridanek: I'll provide a comprehensive analysis of the Zig cross-compilation approach with improvement suggestions.

🎯 Overall Commentary

The Zig cc approach is innovative and pragmatic for cross-compiling to s390x from x86_64/arm64 hosts. Zig's ability to act as a drop-in C/C++ compiler with built-in cross-compilation is well-suited for this use case. However, the implementation has several areas that need refinement.

🔍 Current Architecture Analysis

Strengths:

  • ✅ Avoids needing a full cross-compilation toolchain (gcc, binutils, etc.)
  • ✅ Zig provides consistent behavior across platforms
  • ✅ Handles the problematic -Wp, preprocessor flags
  • ✅ syscall.Exec approach (Go) is efficient - no subprocess overhead

Weaknesses:

  • ❌ Duplicate wrapper implementations (Go + Python)
  • ❌ Hardcoded paths and targets throughout
  • ❌ Incomplete argument transformation in Python wrapper
  • ❌ Limited error handling and diagnostics
  • ❌ Lack of documentation

📋 Specific Improvement Suggestions

1. Choose One Wrapper Implementation

You have both zigcc.go and wrapper.py doing similar jobs. Recommendation: Keep the Go implementation.

Reasons:

  • More complete -Wp flag handling (splits on commas properly)
  • Better performance (compiled binary vs Python interpreter)
  • Uses syscall.Exec - no subprocess overhead
  • Already has tests

Action: Remove wrapper.py or document why both exist.

2. Fix Incomplete -Wp Handling in Python Wrapper

The Python wrapper only handles -Wp,-D specifically:

if arg.startswith("-Wp,-D"):
    args.append(arg.replace("-Wp,-D", "-D", 1))

But the Go version correctly handles any -Wp, flag:

if strings.HasPrefix(arg, "-Wp,") {
    newArgs = append(newArgs, strings.Split(arg, ",")[1:]...)
}

Example failure case: -Wp,-DNDEBUG,-D_FORTIFY_SOURCE=2 won't work in Python wrapper.

3. Make Paths and Targets Configurable

Currently hardcoded everywhere:

  • /mnt/zig path
  • s390x-linux-gnu.2.34 target

Suggestions:

// zigcc.go - use environment variables with defaults
zigPath := getEnvOrDefault("ZIG_PATH", "/mnt/zig")
target := getEnvOrDefault("ZIG_TARGET", "s390x-linux-gnu.2.34")
# sandbox.py - parameterize
def buildinputs(
    dockerfile: pathlib.Path | str,
    platform: str,
    zig_version: str = "0.15.1",
    zig_target: str = "s390x-linux-gnu.2.34"
) -> list[pathlib.Path]:

4. Fix Makefile Architecture Detection

The Makefile references $(ARCH) but I don't see where it's defined in the grep output:

# Add this near the top of Makefile
ARCH_RAW := $(shell uname -m)
ARCH := $(shell echo $(ARCH_RAW) | sed -e 's/aarch64/arm64/' -e 's/x86_64/amd64/')

Also, the Zig download uses $(ARCH) but Zig's download URLs use different conventions (x86_64, aarch64, not amd64/arm64).

5. Improve Makefile Target

The bin/zig-$(ZIG_VERSION) target has issues:

bin/zig-$(ZIG_VERSION):
	@echo "Installing Zig $(ZIG_VERSION)..."
	TMPDIR=$(shell mktemp -d)  # ❌ Wrong - shell executes at parse time
	wget --progress=dot:giga ...

Fixed version:

bin/zig-$(ZIG_VERSION):
	@echo "Installing Zig $(ZIG_VERSION)..."
	$(eval TMPDIR := $(shell mktemp -d))
	wget --progress=dot:giga https://ziglang.org/download/$(ZIG_VERSION)/zig-$(ARCH)-linux-$(ZIG_VERSION).tar.xz
	tar -xJf zig-$(ARCH)-linux-$(ZIG_VERSION).tar.xz -C $(TMPDIR) --strip-components=1
	rm -rf zig-$(ARCH)-linux-$(ZIG_VERSION).tar.xz
	mkdir -p bin
	mv $(TMPDIR) bin/zig-$(ZIG_VERSION)
	chmod +x bin/zig-$(ZIG_VERSION)/zig
	@echo "Zig installed successfully"

6. Remove Shell Wrapper Creation from Makefile

The Makefile creates shell wrappers that are immediately replaced by the Go binary:

# These are overwritten by sandbox.py later
printf '%s\n' '#!/bin/sh' 'exec /mnt/zig cc ...' > $$TMPDIR/zig-cc

Recommendation: Remove these and let sandbox.py handle wrapper installation exclusively.

7. Add Proper Error Handling

In zigcc.go:

func main() {
    // Add validation
    if _, err := os.Stat("/mnt/zig"); os.IsNotExist(err) {
        fmt.Fprintf(os.Stderr, "Error: Zig binary not found at /mnt/zig\n")
        fmt.Fprintf(os.Stderr, "Ensure Zig is mounted correctly\n")
        os.Exit(1)
    }
    
    // Log what we're doing (when verbose flag set)
    if os.Getenv("ZIG_WRAPPER_VERBOSE") != "" {
        fmt.Fprintf(os.Stderr, "Executing: %v\n", newArgs)
    }
    
    // ... rest of code
}

8. Improve Test Coverage

Current test only covers -Wp processing. Add tests for:

func TestProcessArg0(t *testing.T) {
    tests := []struct {
        arg0     string
        expected string
        wantErr  bool
    }{
        {"zig-cc", "cc", false},
        {"zig-c++", "c++", false},
        {"invalid", "", true},
    }
    // ...
}

func TestFullExecution(t *testing.T) {
    // Test with mock Zig binary
    // Verify argument order and transformation
}

9. Add Documentation

Create scripts/zigcc/README.md:

# Zig CC Wrapper

This wrapper enables cross-compilation to s390x using Zig as a drop-in replacement for gcc/g++.

## How It Works

1. The wrapper is invoked as `zig-cc` or `zig-c++`
2. It transforms arguments (especially -Wp flags) for Zig compatibility
3. It executes Zig with the target architecture set to s390x

## Known Limitations

- Zig doesn't support `-Wp,` preprocessor flags, so we split them
- Target is currently hardcoded to `s390x-linux-gnu.2.34`

## Building



## Testing

10. Handle Commented-Out Code in sandbox.py

Remove or document the commented-out CC/CXX environment settings:

# f"--env=CC=/mnt/zig cc -target {target}",  # Why commented out?
# f"--env=CXX=/mnt/zig c++ -target {target}",

Recommendation: Either remove them or add a comment explaining the decision:

# CC/CXX are unset instead of pointing to wrappers because:
# - Some build systems detect and cache the compiler
# - Letting them auto-detect ensures wrapper is found via PATH

11. Remove Debug Logs from Production Code

The large triple-quoted strings in sandbox.py containing build logs should be removed:

"""
Downloading jedi
  × Failed to build `pyzmq==27.1.0`
...
"""

These are useful for debugging but don't belong in production code. Move to a separate debug log file or remove entirely.

12. Consider Zig Version

You're using Zig 0.15.1. Check if there's a newer stable version that might have better compatibility or bug fixes:

13. Add Dockerfile Improvement

The RUN ls /mnt && true line seems like a debug command:

RUN ls /mnt && true

Recommendation: Remove this or add a comment explaining why it's needed. If it's verifying mount availability, make it more explicit:

# Verify /mnt is available for Zig toolchain mounting
RUN test -d /mnt || (echo "Error: /mnt directory not available" && exit 1)

🎯 Priority Recommendations

High Priority:

  1. Choose one wrapper implementation (Go recommended)
  2. Fix Makefile TMPDIR and ARCH issues
  3. Remove debug code and logs from production
  4. Add basic documentation

Medium Priority:
5. Make paths/targets configurable
6. Improve error handling and diagnostics
7. Expand test coverage

Low Priority:
8. Check for newer Zig version
9. Add verbose/debug mode
10. Consider additional architecture targets

🤔 Architectural Questions

  1. Why not use CC/CXX environment variables? Setting them to the wrapper paths would be more standard than unsetting them.
  2. Why mount at /mnt? This is typically for external filesystems. Consider /opt/zig or /usr/local/zig.
  3. Why glibc 2.34? The comment mentions "target glibc 2.28 or newer" but uses 2.34. Document this decision.
  4. How does this work with GitHub Actions? The PR title mentions "mount /mnt on github actions" - what's the constraint there?

Would you like me to elaborate on any of these suggestions or help implement specific improvements?


🏁 Script executed:

make build

Length of output: 42


🏁 Script executed:

make test

Length of output: 42


🏁 Script executed:

#!/bin/bash
# Check latest Zig version
curl -s https://ziglang.org/download/index.json | jq -r '.master.version, .latest.version' 2>/dev/null || echo "Could not fetch Zig versions"

Length of output: 30


🏁 Script executed:

#!/bin/bash
# Check Zig download page structure to understand versioning
curl -s https://ziglang.org/download/index.json | jq 'keys' 2>/dev/null
echo "---"
# Get info about 0.15.1 specifically
curl -s https://ziglang.org/download/index.json | jq '.["0.15.1"] // empty' 2>/dev/null | head -20
echo "---"
# Check what stable versions are available
curl -s https://ziglang.org/download/index.json | jq 'to_entries | map(select(.key | test("^[0-9]+\\.[0-9]+\\.[0-9]+$"))) | .[].key' 2>/dev/null | sort -V | tail -5

Length of output: 1148


🏁 Script executed:

#!/bin/bash
# Check if 0.15.2 has any relevant improvements
curl -s https://ziglang.org/download/0.15.2/release-notes.html 2>/dev/null | grep -A 5 -i "bug\|fix\|cross\|compile\|target" | head -30
echo "---"
# Also check what architectures are available for 0.15.2
curl -s https://ziglang.org/download/index.json | jq '.["0.15.2"] | keys' 2>/dev/null

Length of output: 518


⚡ Additional Finding: Zig Version Update Available

Zig 0.15.2 is available (you're currently using 0.15.1). While I couldn't extract specific bug fixes from the release notes, it's generally recommended to use the latest patch version for bug fixes and stability improvements.

Recommendation: Update to Zig 0.15.2:

# Makefile
ZIG_VERSION := 0.15.2

All required architectures (x86_64-linux, aarch64-linux, s390x-linux) are available in 0.15.2.


📝 Summary

Your Zig cross-compilation approach is solid conceptually but needs refinement:

Quick wins:

  • ✅ Update to Zig 0.15.2
  • ✅ Remove duplicate Python wrapper (keep Go)
  • ✅ Fix Makefile TMPDIR issue
  • ✅ Remove debug logs from sandbox.py
  • ✅ Add README documentation

For production readiness:

  • ⚙️ Make paths/targets configurable
  • 🧪 Expand test coverage
  • 📋 Better error messages
  • 🔍 Document architectural decisions

The approach of using Zig for cross-compilation is excellent for avoiding complex toolchain setup. Once polished, this will be a clean solution for building s390x containers on x86_64/arm64 hosts.

Would you like me to help implement any of these improvements, or would you prefer to tackle specific areas first?

@jiridanek jiridanek marked this pull request as draft November 12, 2025 19:07
@jiridanek jiridanek changed the title see if I can mount /mnt on github actions too introduce zig cc cross-compilation setup for GitHub Actions and local development Nov 12, 2025
@openshift-ci openshift-ci bot added size/l and removed size/l labels Nov 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

do-not-merge/work-in-progress needs-rebase review-requested GitHub Bot creates notification on #pr-review-ai-ide-team slack channel size/l

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants